#ifndef BAIDU_AI_ASR_H
#define BAIDU_AI_ASR_H

#include <string>
#include <chrono>      // 用于时间处理的头文件
#include <curl/curl.h> // libcurl库头文件，用于HTTP请求
#include <json/json.h> // JSON解析库头文件

class BaiduAiAsr
{
public:
    // 构造函数，需要传入百度AI平台的API Key和Secret Key
    BaiduAiAsr(const std::string &apiKey, const std::string &secretKey);
    ~BaiduAiAsr();

    // 获取当前访问令牌
    std::string getAccessToken() const;

    // 刷新访问令牌（如果已过期）
    void refreshToken();

    // 语音识别主功能函数
    // 参数说明：
    // - audioFile: 音频文件路径
    // - format: 音频格式，默认为pcm
    // - rate: 采样率，默认为16000Hz
    // - channel: 声道数，默认为1（单声道）
    std::string speechRecognition(const std::string &audioFile, const std::string &format = "pcm",
                                  int rate = 16000, int channel = 1);

    // 语音识别主功能函数
    // 参数说明：
    // - audioFile: 音频数据
    std::string speechRecognition(const std::vector<uint8_t> &audioData);

private:
    std::string apiKey_;                                      // 百度AI平台API Key
    std::string secretKey_;                                   // 百度AI平台Secret Key
    std::string accessToken_;                                 // 当前有效的访问令牌
    unsigned int expiresIn_;                                  // 令牌有效期（秒）
    std::chrono::system_clock::time_point tokenObtainedTime_; // 令牌获取时间点

    // 请求新的访问令牌
    void requestAccessToken();

    // 读取音频文件内容
    std::string readAudioFile(const std::string &filename) const;

    // libcurl回调函数，用于接收HTTP响应数据
    static size_t onWriteData(void *buffer, size_t size, size_t nmemb, void *userp);

    // 检查访问令牌是否过期
    bool isTokenExpired() const;
};

#endif // BAIDU_AI_ASR_H
